Try to handle buffer/file modifications which conflict with VCS locking.
authorChong Yidong <cyd@gnu.org>
Sun, 6 Jan 2013 02:58:57 +0000 (10:58 +0800)
committerChong Yidong <cyd@gnu.org>
Sun, 6 Jan 2013 02:58:57 +0000 (10:58 +0800)
* vc/vc-hooks.el (vc-after-save): DTRT for locking VCSes.

* vc/vc.el (vc-next-action): Detect buffer modifications
conflicting with locking VCS operation.

Fixes: debbugs:11490
lisp/ChangeLog
lisp/vc/vc-hooks.el
lisp/vc/vc.el

index f2c6b5691269d9a4651ae7d3b5bec66f2449c588..fe3c252c30650aeb56884cea76ff65211d529f33 100644 (file)
@@ -1,3 +1,10 @@
+2013-01-06  Chong Yidong  <cyd@gnu.org>
+
+       * vc/vc.el (vc-next-action): Detect buffer modifications
+       conflicting with locking VCS operation (Bug#11490).
+
+       * vc/vc-hooks.el (vc-after-save): DTRT for locking VCSes.
+
 2013-01-05  Michael Albinus  <michael.albinus@gmx.de>
 
        * net/tramp-adb.el (tramp-do-parse-file-attributes-with-ls):
index 5a2b47bb34f30cfbfc630f6429a80d98f1dcf32b..99436303fa2fa7c864bcea538d3139b2d74fe1ad 100644 (file)
@@ -703,19 +703,21 @@ Before doing that, check if there are any old backups and get rid of them."
   ;; the state to 'edited and redisplay the mode line.
   (let* ((file buffer-file-name)
          (backend (vc-backend file)))
-    (and backend
-        (or (and (equal (vc-file-getprop file 'vc-checkout-time)
-                        (nth 5 (file-attributes file)))
-                 ;; File has been saved in the same second in which
-                 ;; it was checked out.  Clear the checkout-time
-                 ;; to avoid confusion.
-                 (vc-file-setprop file 'vc-checkout-time nil))
-            t)
-         (eq (vc-checkout-model backend (list file)) 'implicit)
-         (vc-state-refresh file backend)
-        (vc-mode-line file backend))
-    ;; Try to avoid unnecessary work, a *vc-dir* buffer is
-    ;; present if this is true.
+    (cond
+     ((null backend))
+     ((eq (vc-checkout-model backend (list file)) 'implicit)
+      ;; If the file was saved in the same second in which it was
+      ;; checked out, clear the checkout-time to avoid confusion.
+      (if (equal (vc-file-getprop file 'vc-checkout-time)
+                (nth 5 (file-attributes file)))
+         (vc-file-setprop file 'vc-checkout-time nil))
+      (if (vc-state-refresh file backend)
+         (vc-mode-line file backend)))
+     ;; If we saved an unlocked file on a locking based VCS, that
+     ;; file is not longer up-to-date.
+     ((eq (vc-file-getprop file 'vc-state) 'up-to-date)
+      (vc-file-setprop file 'vc-state nil)))
+    ;; Resynch *vc-dir* buffers, if any are present.
     (when vc-dir-buffers
       (vc-dir-resynch-file file))))
 
index fe25980626734a7d07249adcd121ac253a6fc037..9b8b94916c4fcc8c1a5af48f7acf897cb5527ce7 100644 (file)
 (eval-when-compile
   (require 'dired))
 
+(declare-function dired-get-filename "dired" (&optional localp noerror))
+(declare-function dired-move-to-filename "dired" (&optional err eol))
+(declare-function dired-marker-regexp "dired" ())
+
 (unless (assoc 'vc-parent-buffer minor-mode-alist)
   (setq minor-mode-alist
        (cons '(vc-parent-buffer vc-parent-buffer-name)
@@ -1072,6 +1076,17 @@ For old-style locking-based version control systems, like RCS:
          ;; among all the `files'.
         (model (nth 4 vc-fileset)))
 
+    ;; If a buffer has unsaved changes, a checkout would discard those
+    ;; changes, so treat the buffer as having unlocked changes.
+    (when (and (not (eq model 'implicit)) (eq state 'up-to-date))
+      (let ((files files))
+       (while files
+         (let ((buffer (get-file-buffer (car files))))
+           (and buffer
+                (buffer-modified-p buffer)
+                (setq state 'unlocked-changes
+                      files nil))))))
+
     ;; Do the right thing
     (cond
      ((eq state 'missing)